Введение
В большинстве протоколов передачи данных для обеспечения достоверности их передачи обычно используется контрольная сумма произвольного блока данных. Для повышения качества проверки данных вместо контрольной суммы можно применять специальный код, так называемый CRC (Cyclic Redundancy Code – циклический избыточный код). Обычно используют коды с разрядностью 8, 16 или 32 бит. Для вычисления такого кода применяются исходные полиномы определённого вида.
В отличие от простой контрольной суммы код CRC позволяет обнаружить искажение даже в одном бите большого массива данных. Если обнаружено несовпадение кода CRC, вычисленного на приёмной стороне для блока принятых данных, и принятого кода CRC – данные считаются недостоверными и отбраковываются. В этом случае приёмник данных посылает сообщение об ошибке кода CRC и осуществляется повторная передача данных. Таким образом, производится защита данных от искажения во время обмена между устройствами.
В принципе код CRC можно вычислять с помощью программы. Однако на такое вычисление требуется определённое время. И если обмен данными происходит регулярно, то процессору потребуется отводить немало времени на подсчёт кодов CRC для каждой передачи или приёма данных.
Для снижения затрат времени на эти операции 32-разрядные ARM-микроконтроллеры серии STM32 [1] были оснащены аппаратным блоком вычисления контрольной суммы данных в виде кода CRC.
Описание блока
На рисунке приведена диаграмма работы блока вычисления CRC микроконтроллера STM32.

Вычисление кода CRC в блоке производится с помощью 32-разрядного регистра ввода и вывода и вычислителя CRC с полиномом. Подсчёт кода производится за 4 тактовых цикла шины AHB с тактовой частотой HCLK.
Блок вычисления микроконтроллера STM32 использует для получения 32-битного слова кода CRC полином вида: X^32 + X^26 + X^23 + X^22 + X^16 + X^12 + X^11 + X^10 +X^8 + X^7 + X^5 + X^4 + X^2 + X + 1. Этот полином можно представить в виде шестнадцатеричного числа: 0x04C11DB7. Каждый разряд этого числа определяет наличие или отсутствие члена полинома X в соответствующей степени.
Блок вычисления использует 32-разрядный регистр данных как входной регистр для записи очередных данных для вычислителя кода CRC, а также хранит в нём результат предыдущего вычисления CRC, используемый при чтении этого регистра. Каждая операция записи в регистр данных создаёт комбинацию предыдущего значения CRC и его нового значения. Вычисление кода CRC выполняется не побайтно, а сразу над целым 32-разрядным словом.
Вычисление кода CRC обычно используется для проверки корректности передачи и приёма данных. Кроме того, в соответствии со стандартом EN/IEC 60335-1 код CRC может использоваться для проверки целостности содержимого флэш-памяти. Код CRC программы вычисляется в контроллере во время его работы, а затем сравнивается с контрольной суммой, которая была подсчитана во время её предварительной компоновки и была сохранена в определённой области памяти. При их несовпадении формируется соответствующее прерывание, и выполнение программы прекращается.
Регистры блока
Блок вычисления CRC включает в свой состав следующие регистры:
- регистр данных CRC_DR;
- регистр независимых данных CRC_IDR;
- регистр управления CRC_CR.
В таблице приведена карта регистров блока вычисления CRC, а также и их значения после сброса.

Регистр данных CRC_DR используется как входной регистр при записи новых данных в вычислитель CRC. При чтении он содержит предыдущий результат вычисления CRC.
Регистр независимых данных CRC_IDR используется как 8-разрядный регистр общего назначения. Он может использоваться для временного хранения одного байта. Данные этого регистра сохраняются при сбросе CRC, вызванного битом регистра CRC_CR.
Регистр управления CRC_CR содержит всего один бит, используемый как бит сброса. Он сбрасывает блок вычисления CRC и устанавливает регистр данных в исходное значение 0xFFFF FFFF. Этот бит программно можно только устанавливать. Сбрасывается он автоматически, аппаратно.
Более подробную информацию о блоке вычисления кода CRC можно получить в оригинальном источнике [2].
Программирование
Библиотека CMSIS предоставляет целый набор функций для работы с блоком CRC. Функции этой библиотеки и подробные комментарии к ним представлены в листинге 1.

Для инициализации блока вычисления кода CRC и работы с ним необходимо выполнить следующие действия:
- разрешить тактирование блока;
- произвести сброс данных блока;
- записать массив данных в блок;
- считать вычисленное значение кода CRC из блока.
Рассмотрим конкретный пример программы, приведённый в листинге 2, которая позволяет вычислить код CRC для массива данных.

В результате работы программы переменная data_crc будет иметь значение 0x4B6B373E. Это и есть код CRC, который можно передавать вместе с массивом данных по каналу связи.
Таким образом, с помощью блока вычисления кода СRС обеспечивается надёжный обмен данными с внешним устройством без увеличения нагрузки на процессор микроконтроллера STM32.
Литература
- https://www.st.com.
- http://www.st.com/web/en/resource/technical/document/reference_manual/CD00246267.pdf.
© СТА-ПРЕСС
Если вам понравился материал, кликните значок — вы поможете нам узнать, каким статьям и новостям следует отдавать предпочтение. Если вы хотите обсудить материал —не стесняйтесь оставлять свои комментарии : возможно, они будут полезны другим нашим читателям!

